home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / datelib.exe / CALCTIME.C < prev    next >
C/C++ Source or Header  |  1992-03-27  |  4KB  |  154 lines

  1. static char calctime_prog[] = "@(#)Zeit +/- Zahl";
  2. static char calctime_ver[]  = "@(#)v1.00/kr ; 10.06.91";
  3. /* calctime         Rechnen mit Zeiten
  4. **
  5. ** Autor            Klaus Rath
  6. **
  7. ** Deklaration      char *calctime(char *zeit, long abstand, char *erg);
  8. **
  9. ** Übergabe         Die Funktion erwartet einen String in einem der folgenden
  10. **                  Formate :
  11. **                  hh:mm[:ss] -- Formate 1,2
  12. **                  hh.mm[.ss] -- Formate 3,4
  13. **                  hhmm[ss]   -- Datenbankformate 5,6
  14. **                  sowie einen long-Wert, dessen Vorzeichen die gewünschte
  15. **                  Operation festlegt.
  16. ** Rückgabe         Zeiger auf ein char-Array erg, daß ausreichend dimensioniert
  17. **                  sein muß - calctime gibt immer im langen Format zurück.
  18. **                  Für deutsches und amerikanisches Format werden also 9,
  19. **                  fürs DDB/4-Format 7 Zeichen benötigt!
  20. **
  21. ** Anmerkungen
  22. **
  23. ** Änderungen       1.00 ; 10.06.91
  24. **                  - Erste Version
  25. */
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <time.h>
  30. #ifdef __TURBOC__
  31. #define ANSI
  32. #define MSDOS
  33. #include <stdlib.h>
  34. #include <sys\types.h>
  35. #else
  36. #include <sys/types.h>
  37. #endif
  38. #include "datum.h"
  39.  
  40. #ifdef ANSI
  41. char *calctime(char *tstring, long abstand, char *erg)
  42. #else
  43. char *calctime(tstring,abstand,erg)
  44. char *tstring;
  45. long abstand;
  46. char *erg;
  47. #endif
  48. {
  49.     char   stunden_s[3],minuten_s[3],sekunden_s[3];
  50.     long   stunden,     minuten,     sekunden;
  51.     long   gesamt;
  52.     int    format;
  53.     int    zaehler;
  54.  
  55.     gesamt = 0L;
  56.  
  57.     /* Überprüfung auf Gültigkeit bzw. Format :
  58.     */
  59.     format = checktime(tstring);
  60.     if ( !format ) {
  61.         return(NULL);
  62.     }
  63.  
  64.     /* Format überprüfen und umkopieren :
  65.     */
  66.     if ( format >= 1 && format <= 4 ) {
  67.         stunden_s[0] = tstring[0];
  68.         stunden_s[1] = tstring[1];
  69.         stunden_s[2] = '\0';
  70.         minuten_s[0] = tstring[3];
  71.         minuten_s[1] = tstring[4];
  72.         minuten_s[2] = '\0';
  73.         if ( format == 2 || format == 4 ) {
  74.             sekunden_s[0] = tstring[6];
  75.             sekunden_s[1] = tstring[7];
  76.             sekunden_s[2] = '\0';
  77.         }
  78.         else {
  79.             sekunden_s[0] = '0';
  80.             sekunden_s[1] = '0';
  81.             sekunden_s[2] = '\0';
  82.         }
  83.     } /* ENDE: Formate 1-4 */
  84.     else if ( format == 5 || format == 6 ) {            /* Datenbank-Format */
  85.         stunden_s[0] = tstring[0];
  86.         stunden_s[1] = tstring[1];
  87.         stunden_s[2] = '\0';
  88.         minuten_s[0] = tstring[2];
  89.         minuten_s[1] = tstring[3];
  90.         minuten_s[2] = '\0';
  91.         if ( format == 6 ) {
  92.             sekunden_s[0] = tstring[4];
  93.             sekunden_s[1] = tstring[5];
  94.             sekunden_s[2] = '\0';
  95.         }
  96.         else {
  97.             sekunden_s[0]  = '0';
  98.             sekunden_s[1]  = '0';
  99.             sekunden_s[2]  = '\0';
  100.         }
  101.     } /* ENDE: Datenbankformat */
  102.     /* ENDE:if(Formatprüfung und Kopierung) */
  103.  
  104.     /* Konvertierung und Summation :
  105.     */
  106.     stunden  = atol(stunden_s);
  107.     minuten  = atol(minuten_s);
  108.     gesamt   = (stunden*60L) + minuten;
  109.  
  110.     /* Rückgabeformat auf das passende Langformat einstellen :
  111.     */
  112.     switch ( format ) {
  113.  
  114.       case TI_HM_D:
  115.       case TI_HMS_D:
  116.                       format = TI_HMS_D;
  117.                       break;
  118.       case TI_HM_P:
  119.       case TI_HMS_P:
  120.                       format = TI_HMS_P;
  121.                       break;
  122.       case TI_HM_DB:
  123.       case TI_HMS_DB:
  124.                       format = TI_HMS_DB;
  125.                       break;
  126.       default:        format = TI_HMS_D;
  127.     }
  128.  
  129.     /* Aktion ermitteln :
  130.     */
  131.     if ( abstand == 0 ) {
  132.         cnvttime(tstring,format,erg);
  133.         return(erg);
  134.     }
  135.     else if ( abstand > 0 ) {                                   /* Addition */
  136.         gesamt += abstand;
  137.         if ( gesamt > TI_MAX_MIN )
  138.            strcpy(erg,TI_MAX_VAL);
  139.         else
  140.            strcpy(erg,mk_timestr(gesamt,'m',format));
  141.         return(erg);
  142.     } /* ENDE: abstand > 0  */
  143.     else if ( abstand < 0 ) {                                /* Subtraktion */
  144.         abstand = abstand*(-1L);
  145.         gesamt -= abstand;
  146.         if ( gesamt < 0L )
  147.            gesamt = 0L;
  148.         strcpy(erg,mk_timestr(gesamt,'m',format));
  149.         return(erg);
  150.     } /* ENDE: abstand */
  151.  
  152.     return(NULL);
  153. } /* ENDE: calctime() */
  154.